
#define maxn  30030
int n,m;
int M=-1;
int first[maxn],next[maxn],E[maxn],Ef[maxn];
void insert(int a,int b)
{
	M++;
	next[M]=first[a];
	first[a]=M;
	E[M]=b;
	Ef[M]=a;
}

void init()
{
	M=-1;
	memset(first,-1,sizeof(first));
}
/********************lca模板******************************/
int  depth[maxn],to[maxn],rmq[maxn][19],size=0,use[maxn];//to序列的长度要2*n，点的两倍
void dfs(int u,int p,int dep)//深度优先搜索构造depth数组
{
	depth[u]=dep;
	to[u]=size;
	rmq[size++][0]=u;
	use[u]=1;
	for(int e=first[u]; e!=-1; e=next[e])
	{
		int v=E[e];
		if(!use[v])
		{
			dfs(v,u,dep+1);
			rmq[size++][0]=u;
		}
	}
}

void rmqinit()
{
	int i,j,k,len,last=1;
	for(k=1; (1<<k)<=size; k++)
	{
		len = 1<<k;
		for(i=0; i+len<=size; i++)
		{
			rmq[i][k]=(depth[rmq[i][k-1]]<depth[rmq[i+last][k-1]])?rmq[i][k-1]:rmq[i+last][k-1];
		}
		last=len;
	}
}

int askrmq(int x,int y)//x,y为要求的树上两点的标号//返回最近公共祖先
{
	int l=to[x];
	int r=to[y];
	if(l>r)	swap(l,r);
	int k;
	for(k=1; l+(1<<k)<=r; k++);
	
	k--;
	return (depth[rmq[l][k]]<depth[rmq[r-(1<<k)+1][k]])?rmq[l][k]:rmq[r-(1<<k)+1][k];
}

void initlca()
{
	size=0;
	memset(use,0,sizeof(use));
	memset(depth,0,sizeof(depth));
}
/********************lca模板******************************/
int in[maxn];
int main()
{
#ifndef ONLINE_JUDGE
	freopen("in","r",stdin);
#endif
    int i,j,k;
	int t;
	scanf("%d", &t);
	while(t--)
	{
		init();	
		scanf("%d", &n);
		int a,b;
		memset(in,0,sizeof(in));
		initlca();
		for(i=0; i<n-1;i++)
		{
			cin>>a>>b;
			insert(a,b);
			insert(b,a);
			in[b]++;
		}
		
		for(i=1; i<=n; i++)
		if(!in[i])
		{
	/********************lca模板******************************/
			dfs(i,-1,0);//深度优先搜索构造depth数组
	/********************lca模板******************************/
		}	
		cin>>a>>b;
/********************lca模板******************************/
		rmqinit();//初始化rmq;
		int ans=askrmq(a,b);//x,y为要求的树上两点的标号//返回最近公共祖先
/********************lca模板******************************/
		cout<<ans<<endl;
	}
}
